public class Test {
    public static void main(String[] args) throws Exception {
        Context ctx = new Context();
        ctx.assign("a", 7); // 设变量 a = 7

        // 构建语法树：a + 3 + 5
        Expression exp = new Add(new Add(new Variable("a"), new Number(3)), new Number(5));

        System.out.println("a + 3 + 5 = " + exp.interpret(ctx)); // 输出 15
    }
}

// 解释器模式 = “语法规则 ⇒ 类”
// 每个类负责解析并执行自己的那一小段，组合成树就能解释整句话
// 解释器模式 = 把语法树当成“手写栈机器”，每个节点负责压、弹、算、返回，树遍历完=栈执行完
// 上下文（变量仓库）
class Context {
    private final java.util.Map<String, Integer> vars = new java.util.HashMap<>();

    void assign(String var, int val) {
        vars.put(var, val);
    }

    int lookup(String var) {
        return vars.get(var);
    }
}

// 抽象表达式
interface Expression {
    int interpret(Context ctx);
}

// 终结符：字面量
class Number implements Expression {
    private final int value;

    Number(int value) {
        this.value = value;
    }

    public int interpret(Context ctx) {
        return value;
    }
}

// 终结符：变量
class Variable implements Expression {
    private final String name;

    Variable(String name) {
        this.name = name;
    }

    public int interpret(Context ctx) {
        return ctx.lookup(name);
    }
}

// 非终结符：加法
class Add implements Expression {
    private final Expression left, right;

    Add(Expression l, Expression r) {
        this.left = l;
        this.right = r;
    }

    public int interpret(Context ctx) {
        return left.interpret(ctx) + right.interpret(ctx);
    }
}